// 从源对象中选择指定的属性，创建一个新对象

/**
 * 从源对象中选择指定的属性，创建一个新对象
 * @param source 源对象
 * @param keys 键数组，如果未提供则返回所有属性
 * @returns 包含指定属性的新对象
 */
export const toJson = <S extends object>(
  source: S,
  keys?: (keyof S)[],
): Partial<S> | S => {
  if (keys === undefined) {
    // 如果没有提供keys参数，复制所有属性
    return { ...source };
  }

  const result = {} as Partial<S>;

  // 如果提供了keys参数，只复制指定的属性
  keys.forEach((key) => {
    if (key in source) {
      result[key] = source[key];
    } else {
      // 对于不存在的键，设置为undefined
      result[key] = undefined as unknown as S[typeof key];
    }
  });

  return result;
};

/**
 * 从源对象中选择指定的属性，创建一个新对象。若未提供属性键数组，则复制源对象的所有属性；若提供的键在源对象中不存在，则对应的值设为 undefined。
 * @param source 源对象
 * @param keys 键数组，如果未提供则返回所有属性
 * @returns 包含指定属性的新对象
 */
export const toJson2 = <S extends object>(
  source: S,
  keys?: (keyof S)[],
): Partial<S> | S => {
  if (keys === undefined) {
    // 如果没有提供keys参数，复制所有属性
    return { ...source };
  }

  const result = {} as Partial<S>;

  // 如果提供了keys参数，只复制指定的属性
  keys.forEach((key) => {
    if (Object.hasOwn(source, key)) {
      result[key] = source[key];
    } else {
      // 对于不存在的键，设置为undefined
      result[key] = undefined as unknown as S[typeof key];
    }
  });

  return result;
};
